Amazon EventBridgeからEC2インスタンスを起動•停止•再起動する簡易な方法5選
はじめに
Amazon EventBridgeは、イベント駆動アーキテクチャを実現するフルマネージドのサーバレスサービスです。
EventBridgeを使用して、特定のイベントをトリガーにしてEC2インスタンスを再起動や起動、停止させたいケースはあると思います。
本ブログでは、EventBridgeからEC2インスタンスを起動・停止・再起動させる方法について、以下の5つを紹介します。
各方法のメリットデメリットも含めて解説していきます。
- EventBridgeのターゲットに、EC2を起動させるAWS Lambdaを指定
- EventBridgeのターゲットにAWS Systems Manager Automation(以降、SSMオートメーション)のドキュメントを指定
- AWS提供ドキュメントを利用する
- 自作ドキュメントを利用する
- EventBridgeがEC2のAPIを直接呼び出す
- EventBridge SchedulerがEC2のAPIを直接呼び出す
それぞれの構成は、以下の通りです。
先にまとめ
以下は、5つの方法を比較してまとめた表です。
比較項目 | Lambda | SSMオートメーション (AWS提供ドキュメント) |
SSMオートメーション (自作ドキュメント) |
EventBridgeからEC2のAPIを呼ぶ | EventBridge SchedulerからEC2のAPIを呼ぶ |
---|---|---|---|---|---|
EC2の起動可能 | ○ | ○ | ○ | × | ○ |
EC2の停止可能 | ○ | ○ | ○ | ○ | ○ |
EC2の再起動可能 | ○ | ○ | ○ | ○ | ○ |
EC2のインスタンスIDを指定可能 | ○ | ○ | ○ | ○ | ○ |
EC2のタグ指定可能 | ○ | × | ○ | × | × |
メリット | タグ指定できる | 設定が簡単 | タグ指定できる | 設定が簡単 | 設定が簡単 |
デメリット | コード開発が必要 | タグ指定できない | ドキュメント作成が必要 | タグ指定できない EC2の起動ができない |
タグ指定できない |
EC2のインスタンスの指定方法
EC2のインスタンスの指定方法は、インスタンスIDを指定とタグ指定の2つがあります。
EC2インスタンスを削除することがなくインスタンスIDが変わらない場合は、インスタンスIDを指定するとよいですが、インスタンスIDが変わる可能性があれば、タグ指定を推奨します。
タグ指定が必要な場合は、LambdaあるいはSSMオートメーション(自作ドキュメント)のいずれかを選択します。
個人的には、まずSSMオートメーション(自作ドキュメント)を検討し、起動停止に関して複雑なことが必要な場合は、Lambdaを検討すると思います。
タグ指定でなく、インスタンスIDを指定する場合、まず「EventBridgeからEC2のAPIを呼ぶ」を検討するとよいです。
各方法の設定方法
次に、各方法の具体的な設定方法を簡単に説明します。
Lambda
すでにブログで解説が公開されているため、下記方法をご参照ください。
タグ指定やインスタンスIDで指定でき、コード次第で複雑なことも対応できます。
SSMオートメーション(AWS提供ドキュメント)
SSMオートメーション(AWS提供ドキュメント)を用いた方法についてもすでにブログで解説がありますので、以下をご参照ください。
こちらは、インスタンスIDの指定のみです。
SSMオートメーション(自作ドキュメント)
タグ指定もできる自作ドキュメントを用いたSSMオートメーションの方法を紹介します。
ここでは、タグを指定してEC2インスタンスを再起動する手順について説明します。
まず、SSMオートメーションがEC2を操作するためのIAMロールを作成します。
IAMロールの信頼関係は、次のように設定します。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "ssm.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
IAMポリシーは、以下の2つをアタッチします
ResourceGroupsandTagEditorReadOnlyAccess
- タグを読み取るためです。
AmazonSSMAutomationRole
- SSMオートメーションがEC2を操作するためです。
EC2のタグは、キーをAutomation-Restart
、値をON
としました。
次はSSMドキュメントの作成です。作成画面で[Create document]の[Automation]を選択します。
再起動の場合、ドキュメントには、以下の内容を記載します。
description: RestartEC2Instances schemaVersion: '0.3' assumeRole: arn:aws:iam::アカウントID:role/作成したIAMロール名 mainSteps: - name: RestartEC2Instances action: aws:executeAwsApi inputs: Service: ssm Api: StartAutomationExecution DocumentName: AWS-RestartEC2Instance TargetParameterName: InstanceId Targets: - Key: 'tag:Automation-Restart' Values: - 'ON'
EC2の起動の場合は、以下のドキュメントです。
description: StartEC2Instances schemaVersion: '0.3' assumeRole: arn:aws:iam::アカウントID:role/作成したIAMロール名 mainSteps: - name: StartEC2Instances action: 'aws:executeAwsApi' inputs: Service: ssm Api: StartAutomationExecution DocumentName: AWS-StartEC2Instance TargetParameterName: InstanceId Targets: - Key: 'tag:Automation-Restart' Values: - 'ON'
EC2の停止の場合は、以下のドキュメントです。
description: StopEC2Instances schemaVersion: '0.3' assumeRole: arn:aws:iam::アカウントID:role/作成したIAMロール名 mainSteps: - name: StopEC2Instances action: aws:executeAwsApi inputs: Service: ssm Api: StartAutomationExecution DocumentName: AWS-StopEC2Instance TargetParameterName: InstanceId Targets: - Key: 'tag:Automation-Restart' Values: - 'ON'
最後に、作成したSSMドキュメントとバージョンをEventBridgeのターゲットに指定すると、EC2インスタンスの再起動ができます
このとき、新たに作成されたIAMロールにアタッチされた権限は、以下でした。
{ "Version": "2012-10-17", "Statement": [ { "Action": "ssm:StartAutomationExecution", "Effect": "Allow", "Resource": [ "arn:aws:ssm:ap-northeast-1:*:automation-definition/RestartEC2Instances:1" ] } ] }
ポリシーではSSMドキュメントのバージョンも指定されているため、もしバージョンを変更する際は、ポリシーの修正(RestartEC2Instances:1
)も必要です。
EventBridgeからEC2のAPIを呼ぶ
EventBridgeのターゲットをEC2 StopInstances API 呼び出し
やEC2 RebootInstances API 呼び出し
を選択することで、EC2の再起動や停止することができます。
実行ロールは新しいロールを作成
を選択します。
EC2の停止する場合、IAMロールは、ec2:StopInstances
の権限のみでよいのですが、ec2:TerminateInstances
とec2:RebootInstances
と権限が付与されますので、不要の場合は修正しましょう。
EventBridge SchedulerからEC2のAPIを呼ぶ
EventBridge Schedulerを用いた方法については、既にブログ記事が存在します。以下のリンクをご覧ください。
タグ指定はできません。
参考
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/automation-action-executeAwsApi.html